package cn.xiaoliu.basic.service.impl;

import cn.xiaoliu.basic.constant.LoginConstant;
import cn.xiaoliu.basic.exception.BusinessException;
import cn.xiaoliu.basic.service.IVerifyCodeService;
import cn.xiaoliu.basic.utils.SmsUtils;
import cn.xiaoliu.basic.utils.StrUtils;
import cn.xiaoliu.user.domain.User;
import cn.xiaoliu.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;

    /**
     * 发送验证码
     * @param param 参数
     */
    @Override
    public void sendSmsCode(Map<String,String> param) {
        String phone = param.get("phone");
        //拿type是为了判断他是发送注册的验证码还是绑定的验证码
        String type = param.get("type"); //type有两个类型一个是register一个是binder
        //一.基本校验
        //1.手机号不能为空
        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(type)){
            throw new BusinessException("参数不能为空");
        }
        String businessKey = "";
        //这里是在判断他是注册验证码还是绑定的验证码
        if ("register".equals(type)){//注册
            //2.手机号不能是注册过的
            User user = userMapper.loadByPhone(phone);
            if (user!=null){
                throw new BusinessException("此手机号已经被注册过，请直接登录使用");
            }
            businessKey = LoginConstant.PHONE_REGISTER + phone;//注册格式：phone_register:13525057820
        }else if ("binder".equals(type)){//微信绑定
            businessKey = LoginConstant.PHONE_BINDER + phone;//绑定格式：phone_binder:13525057820
        }
        sendYzm(businessKey);
    }
    //真正的发送验证码
    public void sendYzm(String businessKey){
        //二.校验验证码是否有效（从redis中获取的数据通过key来对比）

        Object yzmTmp = redisTemplate.opsForValue().get(businessKey);
        //  key：phone_register：13525057820
        //  value：1126：时间戳
        String yzm = "";
        if (yzmTmp!=null){//1126:时间戳
            //1.如果拿到了值，说明还没有失效，这时就要判断是否过了重发时间
            Long oldTime = Long.valueOf(yzmTmp.toString().split(":")[1]);//时间戳
            //    ①.如果没过，就报错
            if ((System.currentTimeMillis()-oldTime)<=1*60*1000){
                throw new BusinessException("请别乱搞！！！！");
            }
            //    ②.如果过了，就使用原来的验证码：1126
            yzm = yzmTmp.toString().split(":")[0];
        }else {
            //2.如果拿不到，说明验证码已经失效了或者是第一次发送
            //   ①.这时给他生成一个新的验证码
            yzm = StrUtils.getComplexRandomString(4);
        }
        //三.保存新的验证码，并且设置key的过期时间
        String newYzmTmp = yzm + ":" +System.currentTimeMillis();//新验证码：时间戳
        redisTemplate.opsForValue().set(
                businessKey,  //registerNum：13525057820
                newYzmTmp ,//1126:时间戳
                3 , //3分钟有效
                TimeUnit.MINUTES ); //分钟

        //四.调用发短信接口，将验证码发送给客户
        //SmsUtils.sendSms(phone,"您在扫宠物乐园注册的验证码是:"+yzm+",三分钟有效请快速使用" );
        System.out.println("您在宠物乐园注册的验证码是:" + yzm + ",三分钟有效请快速使用");
    }
}
